package fr.esigelec.virtuose;

import java.util.List;

import org.achartengine.ChartFactory;
import org.achartengine.chart.PointStyle;
import org.achartengine.model.XYMultipleSeriesDataset;
import org.achartengine.model.XYSeries;
import org.achartengine.renderer.XYMultipleSeriesRenderer;
import org.achartengine.renderer.XYSeriesRenderer;
import org.w3c.dom.Document;

import fr.esigelec.simulateur.dao.xml.VitesseConsigneDAO;
 
import android.app.Activity;
import android.content.Intent;
import android.graphics.Color;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.view.Menu;

/**
 * @author Anthony Juanes
 * objectif : Activity permettant d'afficher les graphiques d'altitude, de vitesse de consigne et d'angle de pente
 */
public class GraphiqueActivity extends Activity {

	private final String nomFichierConsigneVitesse = Environment.getExternalStorageDirectory().getPath() +"/XML/vitesseConsigne.xml";
		
	@Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_graphique);
        drawGraph();        
	}
	
	public void drawGraph() {
		Log.w("TP", "Graph::Récupération d'activité : Affichage Graphique");
		
		//serie Elevation
		VitesseConsigneDAO vcdao = new VitesseConsigneDAO(getBaseContext());		
		XYSeries seriesElevation = new XYSeries("Elevation");		

		Log.i("TP", "Graph::Récupération des elevations via " + nomFichierConsigneVitesse);
		Document doc = vcdao.getDocument(getBaseContext(), nomFichierConsigneVitesse);
		List<Double> elevations = vcdao.getElevation(doc);
		for(int i=0; i<elevations.size(); i++) {
			seriesElevation.add(i, elevations.get(i));
		}	
		
		//serie vitesse de consigne
		VitesseConsigneDAO vcd = new VitesseConsigneDAO(getBaseContext());
		XYSeries seriesVitesse = new XYSeries("Vitesse de consigne");	

		Log.i("TP", "Graph::Récupération des vitesses via " + nomFichierConsigneVitesse);
		doc = vcd.getDocument(getBaseContext(), nomFichierConsigneVitesse);
		
		List<Integer> vitesses = vcd.getListVitesseXML(doc);
		for(int i=0; i<vitesses.size(); i++) {
			seriesVitesse.add(i, vitesses.get(i));
		}

		// serie Angle
		Log.i("TP", "Graph::Récupération des angles via " + nomFichierConsigneVitesse);	
		XYSeries seriesAngle = new XYSeries("Angle");		
		List<Double> angles = vcdao.getAngle(doc);
		for(int i=0; i<angles.size(); i++) {
			seriesAngle.add(i, angles.get(i));
		}	

		Log.i("TP", "Graph::Set du graphique");
		XYMultipleSeriesRenderer mRenderer = new XYMultipleSeriesRenderer(2);
		mRenderer.setChartTitle("Profil de route");
		mRenderer.setAxisTitleTextSize(16);
		mRenderer.setChartTitleTextSize(20);
		mRenderer.setLabelsTextSize(15);
		mRenderer.setLegendTextSize(20);
		mRenderer.setBackgroundColor(Color.WHITE);
		mRenderer.setApplyBackgroundColor(true);		
		mRenderer.setAxesColor(Color.GRAY);
		mRenderer.setLabelsColor(Color.BLACK);
		mRenderer.setGridColor(Color.LTGRAY); 
		mRenderer.setShowGrid(true);
		mRenderer.setShowLegend(true);
		mRenderer.setShowLabels(true);

		Log.i("TP", "Graph::Définition de la série Elevation");
		XYSeriesRenderer rendererElevation = new XYSeriesRenderer();
		rendererElevation.setPointStyle(PointStyle.SQUARE);
		rendererElevation.setColor(Color.BLUE);
		rendererElevation.setFillPoints(true);
		rendererElevation.setDisplayChartValues(true);
		rendererElevation.setLineWidth(5);
		rendererElevation.setChartValuesTextSize(15);
		rendererElevation.setGradientEnabled(true);
		mRenderer.addSeriesRenderer(rendererElevation);

		Log.i("TP", "Graph::Définition de la série Vitesse");
		XYSeriesRenderer rendererVitesse = new XYSeriesRenderer();
		rendererVitesse.setPointStyle(PointStyle.SQUARE);
		rendererVitesse.setColor(Color.RED);
		rendererVitesse.setFillPoints(true);
		rendererVitesse.setDisplayChartValues(true);
		rendererVitesse.setLineWidth(5);
		rendererVitesse.setChartValuesTextSize(15);
		rendererVitesse.setGradientEnabled(true);
		mRenderer.addSeriesRenderer(rendererVitesse);
		
		Log.i("TP", "Graph::Définition de la série Elevation");
		XYSeriesRenderer rendererAngle = new XYSeriesRenderer();
		rendererAngle.setPointStyle(PointStyle.DIAMOND);
		rendererAngle.setColor(Color.GREEN);
		rendererAngle.setFillPoints(true);
		rendererAngle.setDisplayChartValues(true);
		rendererAngle.setLineWidth(5);
		rendererAngle.setChartValuesTextSize(15);
		rendererAngle.setGradientEnabled(true);
		mRenderer.addSeriesRenderer(rendererAngle);
		
		// Les séries de données du graphique
		XYMultipleSeriesDataset dataset = new XYMultipleSeriesDataset();
		dataset.addSeries(seriesElevation);
		dataset.addSeries(seriesVitesse);	
		dataset.addSeries(seriesAngle);

		Log.i("TP", "Graph::Retour du graphe");
		Intent intent = ChartFactory.getLineChartIntent(getBaseContext(), dataset, mRenderer, "Altitude du parcours");
		startActivity(intent);
		finish();
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.graphique, menu);
		return true;
	}

}
